/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modlemgooglesvn.modlem_src;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.lang.String;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Set;
import modlemgooglesvn.modlem_src.HashLicznik.HashMapLicznik;

/**
 *
 * @author xXx
 */
public class NajlepszyPodzial {
       //  protected ArrayList<HashMapLicznik<String>> podzial = new ArrayList<HashMapLicznik<String>>();
      protected String[] najlepszyPodzial ;
 
//= new HashMapLicznik<String>();
protected HashMapLicznik<String> a;
  public static void main(String[] args) throws IOException {
  TestujPoKolei.main(args);
//  NajlepszyPodzial np = new NajlepszyPodzial() ;
//  String in =  "C:\\wynik.bin";
//       String   s = "C:\\wynik.bin_parametry_bazy.bin";
//  File input = new File(in);
//  File br = new File(s);
//  
// np.jakiPodzialBin(new DataInputStream(new BufferedInputStream(new FileInputStream(input))), 
//               new BufferedReader(new FileReader(br)));
//
// np.najlepszyPodzial();
// np.najlepszyPodzial[0];
//  System.out.println(np.najlepszyPodzial[0]);
//  System.out.println(np.najlepszyPodzial[1]);
  }
    
//  public  ArrayList<HashMapLicznik<String>> zwrocLicznik(){
//  
//      return licznik;
//  
//  }
  
  public String[] getBestSplit(){
      
      return najlepszyPodzial;
      
  }
   ArrayList<HashMapLicznik<String>>  licznik = new ArrayList<HashMapLicznik<String>>();
  int max = Integer.MAX_VALUE;
  public void najlepszyPodzial(){
 
        najlepszyPodzial = new String[2];
           
    for(int i = 0;i<licznik.size()-1;i++){
        
    //bww.append(licznik.get(i).zwrocKlucze()+"\n\n\n\n\n\n\n");

  //g - Przechowywac bedzie ilos wystapien wartosci w atrybucie , 
  //wartosci od najmniejszej do najwiekszej sa sumowane az przekrocza prog w 
  //tedy sprawdzane sa czy sa najlwepszym podzialem

   if(typAtr[i]==1){
       int s = 0;
   najPodzial(i,s);//int
   }
     if(typAtr[i]==2){
         Double d = 0.0;
   najPodzial(i,d);//double
   }
        if(typAtr[i]==3){
            String s = "";
  // najPodzial(i,s);//string
   }

   //System.out.println(najlepszyPodzial.get(i)+" "+(g-licznik.get(i).odbierzWartosc(l.get(p))));
 // System.out.println(najlepszyPodzial.get(i));
   
    }
 // System.out.println(max);
 //System.out.println(najlepszyPodzial[0]);
   //System.out.println(najlepszyPodzial[1]);
  
  }
  
  public void najPodzial(int i,String s){
  int b= 0;
    Set<String> set = licznik.get(i).zwrocKlucze();
    Object[] o = set.toArray();
   
//     System.out.println(licznik.get(i).odbierzWartosc(l.get(3)));
  int g=0;
  
   ArrayList<String> l= new ArrayList<String>();
  int iloscWartosci = iterator;
  int ileKluczy = o.length;
//System.out.println("Atrybut "+(i) + " , Ile Kluczy : " + ileKluczy);
     for(int k = 0;k<ileKluczy;k++){
         
   l.add((o[k].toString())); 
   
   }
  
//   Collections.sort(l);
       for(int j=0;j<ileKluczy;j++){
      int mod=0;
    g = g + licznik.get(i).odbierzWartosc(l.get(j).toString());

    if(g>=(iloscWartosci/2)){
       // System.out.println(" Atrybut : " + i);
        b=g;
        int g1 = g-(iloscWartosci/2);
        int g2=999999999;
        if(j>0){
          int bb =j -1 ;
         g2 = g-((iloscWartosci/2)-licznik.get(i).odbierzWartosc(l.get(bb).toString()));
        }else g2=Integer.MAX_VALUE;
        
        if(g1<0)g1=-g1;
        if(g2<0)g2=-g2;

            if ((g2 == iloscWartosci/2) || (g1 == iloscWartosci/2)){
            mod = ((g-iloscWartosci/2));
            if(mod<0)mod=-mod;
          if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr, wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 1");
        }
  
        } else if(g1<g2){
    
        b=g-licznik.get(i).odbierzWartosc(l.get(j).toString());
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
              if(mod<max){max=mod;
         najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 2");
        }
  //p=j;
    
    }
    else{
            
            b=g-licznik.get(i).odbierzWartosc( l.get(j).toString());
            
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
               if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 3");
        }
        
    // p=j;
        
    }
        
    }
 // System.out.println(l.get(j) + " " + licznik.get(i).odbierzWartosc(l.get(j)));
   
   }
  
  }
  
  public void najPodzial(int i,int s){
  int b= 0;
    Set<String> set = licznik.get(i).zwrocKlucze();
   Object[] o = set.toArray();
   
 
//     System.out.println(licznik.get(i).odbierzWartosc(l.get(3)));
  int g=0;
  
   ArrayList<Integer> l= new ArrayList<Integer>();
  int iloscWartosci = iterator;
  int ileKluczy = o.length;
//System.out.println("Atrybut "+(i) + " , Ile Kluczy : " + ileKluczy);
     for(int k = 0;k<ileKluczy;k++){
   l.add(Integer.parseInt(o[k].toString())); 
   
   }
  
   Collections.sort(l);
       for(int j=0;j<ileKluczy;j++){
      int mod=0;
    g = g + licznik.get(i).odbierzWartosc(l.get(j).toString());

    
    if(g>=(iloscWartosci/2)){
       // System.out.println(" Atrybut : " + i);
        b=g;
        int g1 = g-(iloscWartosci/2);
        int g2=999999999;
        if(j>0){
          int bb =j -1 ;
         g2 = g-((iloscWartosci/2)-licznik.get(i).odbierzWartosc(l.get(bb).toString()));
        }else g2=Integer.MAX_VALUE;
        
        if(g1<0)g1=-g1;
        if(g2<0)g2=-g2;

            if ((g2 == iloscWartosci/2) || (g1 == iloscWartosci/2)){
            mod = ((g-iloscWartosci/2));
            if(mod<0)mod=-mod;
          if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr, wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 1");
        }

        } else if(g1<g2){
    
        b=g-licznik.get(i).odbierzWartosc(l.get(j).toString());
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
              if(mod<max){max=mod;
         najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 2");
        }
  //p=j;
    
    }
    else{
            
            b=g-licznik.get(i).odbierzWartosc( l.get(j).toString());
            
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
               if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 3");
        }
        
    // p=j;
        
    }
        
    }
 // System.out.println(l.get(j) + " " + licznik.get(i).odbierzWartosc(l.get(j)));
   
   }
  
  }
  
  public void najPodzial(int i,Double s){
  int b= 0;
    Set<String> set = licznik.get(i).zwrocKlucze();
   Object[] o = set.toArray();
   
 
//     System.out.println(licznik.get(i).odbierzWartosc(l.get(3)));
  int g=0;
  
   ArrayList<Double> l= new ArrayList<Double>();
  int iloscWartosci = iterator;
  int ileKluczy = o.length;
//System.out.println("Atrybut "+(i) + " , Ile Kluczy : " + ileKluczy);
     for(int k = 0;k<ileKluczy;k++){
   l.add(Double.parseDouble(o[k].toString())); 
   
   }
  
   Collections.sort(l);
       for(int j=0;j<ileKluczy;j++){
      int mod=0;
    g = g + licznik.get(i).odbierzWartosc(l.get(j).toString());

    
    if(g>=(iloscWartosci/2)){
       // System.out.println(" Atrybut : " + i);
        b=g;
        int g1 = g-(iloscWartosci/2);
        int g2=999999999;
        if(j>0){
          int bb =j -1 ;
         g2 = g-((iloscWartosci/2)-licznik.get(i).odbierzWartosc(l.get(bb).toString()));
        }else g2=Integer.MAX_VALUE;
        
        if(g1<0)g1=-g1;
        if(g2<0)g2=-g2;

        
            if ((g2 == iloscWartosci/2) || (g1 == iloscWartosci/2)){
            mod = ((g-iloscWartosci/2));
            if(mod<0)mod=-mod;
          if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr, wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 1");
        }

        } else if(g1<g2){
    
        b=g-licznik.get(i).odbierzWartosc(l.get(j).toString());
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
              if(mod<max){max=mod;
         najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 2");
        }
  //p=j;
    
    }
    else{
            
            b=g-licznik.get(i).odbierzWartosc( l.get(j).toString());
            
            mod = (b-iloscWartosci/2);
            if(mod<0)mod=-mod;
               if(mod<max){max=mod;
          najlepszyPodzial[0] =(i+"");//i - ktory atr  , wartosc atr
     najlepszyPodzial[1] =(l.get(j)+"");
      System.out.println("Atrybut : " + i + " , Wartosc Atrybutu : " + najlepszyPodzial[1] + " , Max : " + max+" , if nr. 3");
        }
        
    // p=j;
        
    }
        
    }
 // System.out.println(l.get(j) + " " + licznik.get(i).odbierzWartosc(l.get(j)));
   
   }
  
  }
  
  
  
  
  
  
  
  
  
  
  
  
  

    protected int iterator;
    
    public int ileWartosciWAtrybutach(){
    
    return iterator;
    }
    int[] typAtr ;
    public  String[] jakiPodzialBin(DataInputStream dis,BufferedReader br) throws IOException{
    licznik.clear();
       iterator = 0;
        /*
         * Sprawdza jakie sa typy atr
         1- Integer
         2- Double
         3- String
         */
        
       int ileAtr = Integer.parseInt(br.readLine());
       typAtr = new int[ileAtr];
       for(int i = 0 ; i < ileAtr ; i++){
           
           typAtr[i]= Integer.parseInt(br.readLine());
           
       }
    
       licznik = new  ArrayList<HashMapLicznik<String>>() ;
       //boolean przerwij = false;
       int ktoryAtr = 0;
       while(true){
       
           try{
                   try{
                  licznik.get(ktoryAtr);
                    
                  }catch(IndexOutOfBoundsException e){
                      
                  a = new HashMapLicznik<String>();
                  licznik.add(a);
                  //System.out.println("Dodano a");
                  }
                  
                  
                if(typAtr[ktoryAtr]==1){
                int i = dis.readInt();
             
                
               licznik.get(ktoryAtr).umiescWartosc(i+"");
            //   System.out.println(i);
                }
               else if(typAtr[ktoryAtr]==2){
                double d = dis.readDouble();
                licznik.get(ktoryAtr).umiescWartosc(d+"");
                }
               else if(typAtr[ktoryAtr]==3){
                String s = dis.readUTF();
                licznik.get(ktoryAtr).umiescWartosc(s);
               }
               else {System.out.println("Error w NajlepszyPodzial.podzialBin (else)!!");
               }
               
                
                      ktoryAtr++;
       if(ktoryAtr==ileAtr){
           ktoryAtr=0;
               
              iterator++;
               
       }
           }catch(EOFException e){
               
               break;
               
           }
      // if(przerwij == true)
     //   break;

       
       }
       
       najlepszyPodzial();
       
      return najlepszyPodzial;
    }
        
    
     
}
